package sys

import (
	"ginweb-admin/commons/base/api"
	"ginweb-admin/commons/response"
	"ginweb-admin/model/context"
	"ginweb-admin/model/entity/sys"
	"ginweb-admin/utils"
	"github.com/gin-gonic/gin"
	"strings"
)

type SysApiApi struct {
	api.BaseApi
}

// 创建菜单
func (api *SysApiApi) SaveData(c *gin.Context) {
	// 1: 第一件事情就准备数据的载体
	var sysApi sys.SysApi
	err := c.ShouldBindJSON(&sysApi)
	if err != nil {
		// 如果参数注入失败或者出错就返回接口调用这。出错了.
		response.FailWithMessage(err.Error(), c)
		return
	}
	// 创建实例，保存帖子
	data, err := sysApiService.Create(&sysApi)
	// 如果保存失败。就返回创建失败的提升
	if err != nil {
		response.FailWithMessage("创建失败", c)
		return
	}
	// 如果保存成功，就返回创建创建成功
	response.OkMsgData("创建成功", data, c)
}

// 查询权限列表
func (api *SysApiApi) FindList(c *gin.Context) {
	// 获取参数
	keyword := c.Query("keyword")
	// 调用查询的方法
	sysApis, err := sysApiService.FindList(keyword)
	if err != nil {
		response.FailWithMessage("查询失败！", c)
		return
	}
	response.Ok(sysApiService.Tree(sysApis, 0), c)
}

// 查询父级权限
func (api *SysApiApi) FindApiRoot(c *gin.Context) {
	findApiRoot, err := sysApiService.FindApiRoot()
	if err != nil {
		response.OkMessage("查询父级权限失败！", c)
		return
	}
	response.Ok(findApiRoot, c)
}

// 根据ID查询
func (api *SysApiApi) GetById(c *gin.Context) {
	// 获取参数
	id := c.Param("id")

	// 调用根据id查询的方法
	sysApi, err := sysApiService.UnGetById(api.StringToUnit(id))
	if err != nil {
		response.OkMessage("查询失败！", c)
		return
	}
	response.Ok(sysApi, c)
}

// 根据id删除
func (api *SysApiApi) DeleteById(c *gin.Context) {
	// 获取删除的id
	id := c.Param("id")

	// 调用删除的方法
	err := sysApiService.UnDeleteById(api.StringToUnit(id))
	if err != nil {
		response.FailWithMessage("删除失败！", c)
		return
	}
	response.OkMessage("删除成功！", c)
}

// 修改数据
func (api *SysApiApi) UpdateData(c *gin.Context) {
	// 获取用户传递的参数
	var sysApi sys.SysApi
	// 绑定参数
	err := c.ShouldBindJSON(&sysApi)
	if err != nil {
		response.FailWithError(err, c)
		return
	}
	// 结构体转化成map呢？
	// m := structs.Map(sysUser)
	// 继承的结构体无法转换，要么手动添加，要么不使用继承
	// m["is_deleted"] = sysUser.IsDeleted

	// 嵌套结构体转map
	m := utils.StructToMap(sysApi)
	// 调用更新的方法
	err = sysApiService.UpdateData(&sysApi, &m)
	if err != nil {
		response.FailWithMessage("更新失败！", c)
		return
	}
	response.OkMessage("更新成功！", c)
}

// 修改状态
func (api *SysApiApi) UpdateStatus(c *gin.Context) {
	// 获取请求的参数
	status := context.StatusContext{}

	// 绑定参数
	err := c.ShouldBindJSON(&status)
	if err != nil {
		response.FailWithError(err, c)
		return
	}

	// 调用修改的方法
	err = sysApiService.UpdateStatus(status)
	if err != nil {
		response.FailWithMessage("状态更新失败！", c)
		return
	}
	response.OkMessage("状态更新成功！", c)
}

// 批量删除
func (api *SysApiApi) DeleteIds(c *gin.Context) {
	// 获取用户删除的ids  例如：ids = 1,2,3
	ids := c.Query("ids")
	// 根据，拆分 获取到具体的id
	idStrings := strings.Split(ids, ",")

	// 定义存储id数据的容器
	var sysApis []*sys.SysApi
	for _, id := range idStrings {
		// 定义存放每条id数据的容器
		sysApi := sys.SysApi{}
		// 字符串转换成数字类型
		sysApi.ID = api.StringToUnit(id)
		// 把每条id的数据存放到切片类型的容器中
		sysApis = append(sysApis, &sysApi)
	}

	// 调用删除方法
	err := sysApiService.UnDeleteByIds(sysApis)
	if err != nil {
		response.FailWithMessage("批量删除失败！", c)
		return
	}
	response.OkMessage("批量删除成功！", c)
}

// 复制数据
func (api *SysApiApi) CopyData(c *gin.Context) {
	// 获取传递的参数id
	id := c.Param("id")
	// 调用复制的方法
	data, err := sysApiService.CopyData(api.StringToUnit(id))
	if err != nil {
		response.FailWithMessage("复制失败！", c)
		return
	}
	response.Ok(data, c)
}
